package com.shanxia.im.sdk.client.coder;

import com.shanxia.codec.Decoder;
import com.shanxia.codec.ProtocolDataBase;
import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.ByteToMessageDecoder;

import java.util.List;

/**
 * 服务端接收消息路由解码，通过消息类型分发到不同的真正解码器
 */
public class MessageDecoder extends ByteToMessageDecoder {


	@Override
	protected void decode(ChannelHandlerContext arg0, ByteBuf buffer, List<Object> queue) throws Exception {
		
		/*
		 * 消息体不足8位，发生断包情况
		 */
		if (buffer.readableBytes() < 8) {
			return;
		}

		buffer.markReaderIndex();

		byte h1 = buffer.readByte();
		byte h2 = buffer.readByte();
		//起始域 固定为 0xAA 0xF5
		if(h1!=(byte)0xAA || h2!=(byte)0xF5){
			return;
		}

		byte lv = buffer.readByte();
		byte hv = buffer.readByte();
		// 起始域 到 校验和域 整个报文长度
		int length = getContentLength(lv, hv);

		/*
		 * 发生断包情况，等待接收完成
		 */
		if (buffer.readableBytes() < length-4) {
			System.err.println("%%%%%%%%%%%%%%%%%%%%%%%%%% 发生断包情况，等待接收完成 %%%%%%%%%%%%%%%%%%%%%%%%%%");
			buffer.resetReaderIndex();
			return;
		}

		byte[] dataBytes = new byte[length-4];
		buffer.readBytes(dataBytes);

		/*Object message = mappingMessageObject(dataBytes, type);
		queue.add(message);*/

		// 字节数组转换为通用协议对象
		ProtocolDataBase protocolDataBase = Decoder.decodeData(dataBytes, length-4);
		queue.add(protocolDataBase);
	}

	/**
	 * 解析消息体长度
	 * 最大消息长度为2个字节表示的长度，即为65535
	 * @param lv 低位1字节消息长度
	 * @param hv 高位1字节消息长度
	 * @return 消息的真实长度
	 */
	private int getContentLength(byte lv, byte hv) {
		int l = (lv & 0xff);
		int h = (hv & 0xff);
		return l | h << 8;
	}

}
